<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // let userName = "zhangsan";
    // console.log(userName.length);// 8
    // console.log(userName.charAt(0))// z
    // userName.a = 100;
    // console.log(userName.a);// undefined

    //怎么生成一个基本包装类型的包装对象呢?
    // 1- 通过类型所对应的构造函数生成。
    // userName是包装对象
    // const userName = new String("zhangsan");
    // userName2是基本数据类型（字符串String类型也是包装类型中的一种）
    // const userName2= "zhangsan";
    // userName.a = 100;
    // console.log("userName",userName,userName[0],userName.a)
    // console.log("userName2",userName2)
    // console.log(userName == userName2);// true
    // console.log(userName === userName2);// false

    // 2- 通过Object生成。
    // Object构造函数在被实例化时接收的数据类型是什么生成的就是什么类型的包装对象
    // const userName = new Object("zhangsan");
    // const age = new Object(1);
    // console.log(userName);
    // console.log(age);


    // 基本包装类型不是对象，为什么会有属性呢?
    {
        // 答：基本包装类型又称为临时对象类型。在调用基本包装类型的属性和方法时，会临时创建一个对应的包装对象。
        // const userName = "zhangsan";
        // console.log(userName.length);// 8
        // console.log(userName.charAt(0));// z

        // 以上三行代码会隐式执行以下程序：
        // var _userName = new String("zhangsan");
        // console.log(_userName.length);
        // _userName= null;
        // var _userName = new String("zhangsan");
        // console.log(_userName.charAt(0));
        // _userName = null;

        // 为什么为基本包装类型直接增加属性，那么获取到的是undefined
        // const userName = "lisi";
        // userName.a = 100;
        // console.log(userName.a);

        // 以上三行代码相当于：
        // var _userName = new String("lisi");
        // _userName.a = 100;
        // _userName = null;
        // var _userName = new String("lisi");
        // console.log(_userName.a);
        // _userName = null;

    }
    // 引用类型和基本包装类型的区别？
    // {
    //     // 答：生命周期不同。引用类型的数据一直在内存中，而基本包装类型对应的包装对象只是一个临时对象（存在只是一瞬间）
    //     const obj = {
    //         a:1,
    //         b:2
    //     }
    //     obj.c = 100;
    //     console.log(obj.c);// 100
    //
    //     const userName = "lisi";
    //     userName.age = 1;// 为临时创建的包装对象增加属性age
    //     console.log(userName.age);// undefined. 在临时创建的包装对象中调用属性age
    // }

    //如何给基本类型添加方法或者属性呢？
    // {
    //     // 答：为基本包装类型对应的构造函数String,Number,Boolean增加原型方法
    //     // let userName = "zhangsan";
    //     // userName.lastFn = function(){
    //     //
    //     // }
    //     // userName.lastFn();
    //
    //     // 以上代码相当于：
    //     // var one = new String("zhansan");
    //     // one.lastFn = function(){
    //     //
    //     // };
    //     // var two = new String("zhansan");
    //     // two.lastFn();
    //     // console.log(one.__proto__ === String.prototype);// true
    //     // console.log(two.__proto__ === String.prototype);// true
    //     // console.log(one.__proto__ === two.__proto__);// true
    //
    //
    //     // 解决方法：
    //     String.prototype.lastFn = function(){
    //         // console.log("lastFn",this)
    //         return this.charAt(this.length-1);
    //     }
    //     const userName = "lisi";
    //     console.log(userName.lastFn());
    //
    //     const str = "我爱你中国";
    //     console.log(str.lastFn())
    //
    //     // const _userName = new String("lisi");
    //     // _userName.lastFn();
    //     // _userName = null;
    //
    //
    // }
</script>
</html>